Python
파이썬기초_03_메모리 관리와 가비지 컬렉션
작성자 : Heehyeon Yoo|2025-12-17
# Python# Memory# GC# 가비지 컬렉션# Reference Counting
1. 파이썬의 메모리 관리 전략
파이썬은 개발자가 직접 메모리를 할당/해제하지 않는다. (C/C++의 malloc/free 없음)
대신 두 가지 방식을 혼합하여 자동으로 관리한다.
- 레퍼런스 카운팅 (Reference Counting): 주된 방식 (가장 기본)
- 가비지 컬렉션 (Garbage Collection): 보조 방식 (순환 참조 해결용)
2. 레퍼런스 카운팅 (Reference Counting)
- 작동 원리:
- 모든 객체는 자신이 '몇 번 참조되고 있는지' 숫자를 가지고 있음 (
ob_refcnt). - 이 숫자가 0이 되는 즉시 메모리에서 삭제됨.
- 모든 객체는 자신이 '몇 번 참조되고 있는지' 숫자를 가지고 있음 (
- 장점:
- 메모리 해제 시점이 정확함 (사용 끝나자마자 바로 삭제).
- 실시간성이 보장됨.
- 단점:
- 순환 참조 (Cyclic Reference) 문제를 해결하지 못함.
- 예: A가 B를 잡고, B가 A를 잡고 있으면, 둘 다 안 쓰는데도 카운트가 1이라서 영원히 안 지워짐.
3. 세대별 가비지 컬렉션 (Generational Garbage Collection)
레퍼런스 카운팅의 한계(순환 참조)를 해결하기 위해 존재하는 청소부.
- 가설 (Generational Hypothesis):
- "대부분의 객체는 금방 죽는다(쓸모없어진다)."
- "오래 살아남은 객체는 계속 오래 살 것이다."
- 작동 방식 (0세대 ~ 2세대):
- 모든 객체는 처음에 0세대로 태어남.
- 파이썬이 주기적으로 0세대 객체들을 검사(Sweeping/Collection).
- 여기서 살아남은 놈들은 1세대로 승격.
- 또 살아남으면 2세대로 승격.
- 세대가 높을수록(2세대) 검사를 덜 자주 함. (어차피 안 죽을 놈들이니까 검사 비용 아끼려고)
4. 순환 참조와 weakref
- 순환 참조 문제:
gc모듈이 해결해주긴 하지만, GC가 돌기 전까지는 메모리를 차지하고 있음. (비효율)
- 해결책 (
weakref):- 약한 참조 (Weak Reference): 객체를 참조하긴 하되, 레퍼런스 카운트를 증가시키지 않음.
- 캐싱(Caching) 구현이나 상호 참조가 필요할 때 필수적으로 사용.
import weakref
class A: pass
a = A()
r = weakref.ref(a) # 참조 카운트 안 올라감
print(r()) # 객체 접근 가능
del a # 원본 삭제됨
print(r()) # None (접근 불가, 자동으로 연결 끊김)